<?php

namespace plugin\admin\app\service\v1;

use plugin\admin\app\common\Util;
use plugin\admin\app\constant\v1\CommonConstant;

/**
 * 地区服务类
 **/
class RegionService
{

    /**
     * 列表
     *
     * @param integer $lineId 线路ID
     * @param integer $gameId 游戏ID
     * @param integer $areaId 省份ID
     * @param integer $operatorId 运营商ID
     * @param integer $ipSegment IP段
     * @param integer $open 选项：0=全部地区,1=可开地区
     * @return array
     **/
    public static function select($lineId, $gameId, $areaId, $operatorId, $ipSegment, $open)
    {
        $db = Util::db();

        $testDuration = [
            CommonConstant::TIME_0,
            CommonConstant::TIME_1,
            CommonConstant::TIME_2
        ];

        // 地区列表
        $query = $db->table('wa_v1_region')
            ->where('deleted', CommonConstant::DELETE_0)
            ->where('line_id', $lineId)
            ->orderBy('letter', 'asc');
        if ($areaId > 0) {
            $query->where('area_id', $areaId);
        }
        if ($operatorId > 0) {
            $query->where('operator_id', $operatorId);
        }
        $regions = $query->get();
        if ($regions->isEmpty()) {
            return [];
        }

        // 地区Ids
        $regionIds = $regions->pluck('id')->toArray();

        // 节点列表
        $query = $db->table('wa_v1_node_static')
            ->where('deleted', CommonConstant::DELETE_0)
            ->where('line_id', $lineId)
            ->whereIn('region_id', $regionIds)
            ->select('id', 'region_id', 'server_id', 'code');
        $nodes = $query->get();

        // 每个地区分组节点
        $regionNodes = $nodes->groupBy('region_id');

        // 服务器Ids
        $serverIds = $nodes->pluck('server_id')->unique()->toArray();

        // 服务器列表
        $servers = $db->table('wa_v1_server')
            ->where('deleted', CommonConstant::DELETE_0)
            ->whereIn('id', $serverIds)
            ->select('id', 'max_limit')
            ->get()
            ->keyBy('id');

        // 每个服务器的已售数量（所有游戏和地区的订单）
        $serverUsedCounts = OrderService::getServerUsedCounts($db,$lineId,$serverIds,$testDuration);

        // 当前游戏+地区的已售数量
        $regionGameUsedCounts = OrderService::getRegionGameUsedCounts($db,$lineId,$gameId,$regionIds,$testDuration);

        $areaData = $db->table('wa_v1_region_area')->pluck('name', 'id')->toArray();
        $operatorData = $db->table('wa_v1_region_operator')->pluck('name', 'id')->toArray();

        $result = self::buildResult($regions,$regionNodes,$servers,$serverUsedCounts,$regionGameUsedCounts,$areaData,$operatorData, $open);

        $result = self::sortResult($result);
        return $result;
    }

    /**
     * 构建结果集
     */
    public static function buildResult($regions,$regionNodes,$servers,$serverUsedCounts,$regionGameUsedCounts,$areaData,$operatorData, $open)
    {
        $result = [];
        foreach ($regions as $region) {
            $region->area_name = $areaData[$region->area_id] ?? '';
            $region->operator_name = $operatorData[$region->operator_id] ?? '';

            $regionId = $region->id;

            // 节点总数量
            $totalNodes = isset($regionNodes[$regionId]) ? count($regionNodes[$regionId]) : 0;

            // 计算可售数量
            $saleableCount = 0;

            if ($totalNodes > 0) {
                // 当前游戏+地区的已购买数量
                $currentGameUsed = $regionGameUsedCounts[$regionId] ?? 0;

                // 基础可售数量 = 节点总数 - 当前游戏已购买数量
                $baseSaleable = $totalNodes - $currentGameUsed;

                // 考虑服务器限制
                $regionServers = [];
                foreach ($regionNodes[$regionId] as $node) {
                    $serverId = $node->server_id;
                    if (!in_array($serverId, $regionServers)) {
                        $regionServers[] = $serverId;
                    }
                }

                // 计算每个服务器的可用数量
                $serverAvailable = [];
                foreach ($regionServers as $serverId) {
                    if ($server = $servers->get($serverId)) {
                        $maxLimit = $server->max_limit;
                        $usedCount = $serverUsedCounts[$serverId] ?? 0;

                        // 服务器的剩余可用数量
                        $serverAvailable[$serverId] = max(0, $maxLimit - $usedCount);
                    } else {
                        $serverAvailable[$serverId] = 0;
                    }
                }

                // 可售数量取基础可售数量和服务器可用数量的最小值
                $totalServerAvailable = array_sum($serverAvailable);
                $saleableCount = min($baseSaleable, $totalServerAvailable);

                // 确保可售数量不为负数
                $saleableCount = max(0, $saleableCount);
            }

            // 如果开启了可开地区过滤，且可售数量为0，则跳过
            if ($open && $saleableCount <= 0) {
                continue;
            }

            $region->ip_number = $totalNodes; // 总数量
            $region->surplus_number = $saleableCount; // 可售数量
            $region->used_number = $currentGameUsed ?? 0; // 当前游戏+地区的已购买数量
            $result[] = (array)$region;
        }
        return $result;
    }

    /**
     * 排序结果
     */
    public static function sortResult($result)
    {
        if ($result) {
            // 提取排序字段
            $surplus_numbers = array_column($result, 'surplus_number');
            $letters = array_column($result, 'letter');
            // 多字段排序
            array_multisort(
                $surplus_numbers, SORT_DESC,  // 第一排序字段
                $letters, SORT_ASC, // 第二排序字段
                $result // 要排序的数组
            );
        }
        return $result;
    }

}
